package com.zenithmind.mall.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 百亿补贴活动实体 - 遵循单一职责原则，专门管理补贴活动信息
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mall_subsidy_activity")
public class SubsidyActivity extends BaseEntity {

    /**
     * 活动名称
     */
    private String name;

    /**
     * 活动描述
     */
    private String description;

    /**
     * 活动开始时间
     */
    private LocalDateTime startTime;

    /**
     * 活动结束时间
     */
    private LocalDateTime endTime;

    /**
     * 活动状态（0-未开始，1-进行中，2-已结束，3-已暂停）
     */
    private Integer status;

    /**
     * 补贴类型（1-固定金额，2-按比例，3-阶梯补贴）
     */
    private Integer subsidyType;

    /**
     * 补贴金额（固定金额补贴）
     */
    private BigDecimal subsidyAmount;

    /**
     * 补贴比例（按比例补贴，0-1之间）
     */
    private BigDecimal subsidyRate;

    /**
     * 最大补贴金额
     */
    private BigDecimal maxSubsidyAmount;

    /**
     * 最小订单金额（门槛）
     */
    private BigDecimal minOrderAmount;

    /**
     * 总补贴预算
     */
    private BigDecimal totalBudget;

    /**
     * 已使用补贴金额
     */
    private BigDecimal usedBudget;

    /**
     * 每日补贴预算
     */
    private BigDecimal dailyBudget;

    /**
     * 每用户最大补贴金额
     */
    private BigDecimal maxUserSubsidy;

    /**
     * 参与用户等级要求（JSON格式）
     */
    private String userLevelRequirement;

    /**
     * 适用商品分类（JSON格式）
     */
    private String applicableCategories;

    /**
     * 适用商品品牌（JSON格式）
     */
    private String applicableBrands;

    /**
     * 排除商品列表（JSON格式）
     */
    private String excludedProducts;

    /**
     * 活动优先级
     */
    private Integer priority;

    /**
     * 是否启用（0-禁用，1-启用）
     */
    private Integer enabled;

    /**
     * 活动规则说明
     */
    private String rules;

    /**
     * 活动横幅图片
     */
    private String bannerImage;

    // 业务方法

    /**
     * 检查活动是否未开始
     */
    public boolean isNotStarted() {
        return Objects.equals(this.status, 0);
    }

    /**
     * 检查活动是否进行中
     */
    public boolean isActive() {
        return Objects.equals(this.status, 1);
    }

    /**
     * 检查活动是否已结束
     */
    public boolean isEnded() {
        return Objects.equals(this.status, 2);
    }

    /**
     * 检查活动是否已暂停
     */
    public boolean isPaused() {
        return Objects.equals(this.status, 3);
    }

    /**
     * 检查活动是否启用
     */
    public boolean isEnabled() {
        return Objects.equals(this.enabled, 1);
    }

    /**
     * 检查活动是否在时间范围内
     */
    public boolean isInTimeRange() {
        LocalDateTime now = LocalDateTime.now();
        return (startTime == null || !now.isBefore(startTime)) &&
               (endTime == null || !now.isAfter(endTime));
    }

    /**
     * 检查活动是否可以参与
     */
    public boolean canParticipate() {
        return isEnabled() && isActive() && isInTimeRange() && hasBudget();
    }

    /**
     * 检查是否有预算
     */
    public boolean hasBudget() {
        if (totalBudget == null) {
            return true; // 无限制
        }
        BigDecimal used = usedBudget != null ? usedBudget : BigDecimal.ZERO;
        return totalBudget.compareTo(used) > 0;
    }

    /**
     * 检查是否固定金额补贴
     */
    public boolean isFixedAmountSubsidy() {
        return Objects.equals(this.subsidyType, 1);
    }

    /**
     * 检查是否按比例补贴
     */
    public boolean isRateSubsidy() {
        return Objects.equals(this.subsidyType, 2);
    }

    /**
     * 检查是否阶梯补贴
     */
    public boolean isTieredSubsidy() {
        return Objects.equals(this.subsidyType, 3);
    }

    /**
     * 计算补贴金额
     */
    public BigDecimal calculateSubsidyAmount(BigDecimal orderAmount) {
        if (orderAmount == null || !canUseForAmount(orderAmount)) {
            return BigDecimal.ZERO;
        }

        BigDecimal subsidy = BigDecimal.ZERO;

        if (isFixedAmountSubsidy()) {
            subsidy = subsidyAmount != null ? subsidyAmount : BigDecimal.ZERO;
        } else if (isRateSubsidy()) {
            if (subsidyRate != null && subsidyRate.compareTo(BigDecimal.ZERO) > 0) {
                subsidy = orderAmount.multiply(subsidyRate);
            }
        }

        // 应用最大补贴金额限制
        if (maxSubsidyAmount != null && subsidy.compareTo(maxSubsidyAmount) > 0) {
            subsidy = maxSubsidyAmount;
        }

        return subsidy;
    }

    /**
     * 检查订单金额是否满足使用条件
     */
    public boolean canUseForAmount(BigDecimal orderAmount) {
        if (orderAmount == null) {
            return false;
        }
        if (minOrderAmount == null || minOrderAmount.compareTo(BigDecimal.ZERO) <= 0) {
            return true; // 无门槛
        }
        return orderAmount.compareTo(minOrderAmount) >= 0;
    }

    /**
     * 使用补贴预算
     */
    public boolean useBudget(BigDecimal amount) {
        if (amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) {
            return false;
        }

        BigDecimal used = usedBudget != null ? usedBudget : BigDecimal.ZERO;
        BigDecimal newUsed = used.add(amount);

        if (totalBudget != null && newUsed.compareTo(totalBudget) > 0) {
            return false; // 预算不足
        }

        this.usedBudget = newUsed;
        return true;
    }

    /**
     * 退还补贴预算
     */
    public void returnBudget(BigDecimal amount) {
        if (amount != null && amount.compareTo(BigDecimal.ZERO) > 0) {
            BigDecimal used = usedBudget != null ? usedBudget : BigDecimal.ZERO;
            this.usedBudget = used.subtract(amount).max(BigDecimal.ZERO);
        }
    }

    /**
     * 获取剩余预算
     */
    public BigDecimal getRemainingBudget() {
        if (totalBudget == null) {
            return null; // 无限制
        }
        BigDecimal used = usedBudget != null ? usedBudget : BigDecimal.ZERO;
        return totalBudget.subtract(used).max(BigDecimal.ZERO);
    }

    /**
     * 获取预算使用率
     */
    public Double getBudgetUsageRate() {
        if (totalBudget == null || totalBudget.compareTo(BigDecimal.ZERO) <= 0) {
            return 0.0;
        }
        BigDecimal used = usedBudget != null ? usedBudget : BigDecimal.ZERO;
        return used.divide(totalBudget, 4, java.math.RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 启动活动
     */
    public void start() {
        if (isNotStarted() && isEnabled()) {
            this.status = 1;
        }
    }

    /**
     * 结束活动
     */
    public void end() {
        if (isActive() || isPaused()) {
            this.status = 2;
        }
    }

    /**
     * 暂停活动
     */
    public void pause() {
        if (isActive()) {
            this.status = 3;
        }
    }

    /**
     * 恢复活动
     */
    public void resume() {
        if (isPaused()) {
            this.status = 1;
        }
    }

    /**
     * 获取活动状态名称
     */
    public String getStatusName() {
        if (status == null) return "未知";
        
        switch (status) {
            case 0: return "未开始";
            case 1: return "进行中";
            case 2: return "已结束";
            case 3: return "已暂停";
            default: return "未知";
        }
    }

    /**
     * 获取补贴类型名称
     */
    public String getSubsidyTypeName() {
        if (subsidyType == null) return "未知";
        
        switch (subsidyType) {
            case 1: return "固定金额";
            case 2: return "按比例";
            case 3: return "阶梯补贴";
            default: return "未知";
        }
    }

    /**
     * 验证活动数据完整性
     */
    public boolean isValid() {
        return name != null && !name.trim().isEmpty() &&
               startTime != null &&
               endTime != null &&
               startTime.isBefore(endTime) &&
               status != null && status >= 0 && status <= 3 &&
               subsidyType != null && subsidyType >= 1 && subsidyType <= 3 &&
               enabled != null &&
               (subsidyAmount != null || subsidyRate != null);
    }
}
